package io.charstream.filter;

import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class PrintWriterTest {
	public static void main(String[] args) throws IOException{
		String fileName = "c:\\day\\output2.txt";
		//printWriter를 이용한 출력처리
		/*
		 * 프린트라이터는 좀 애매한 놈이다.
		 * 노드 계열이면서도 필터 계열이다.
		 * 이놈은 엄청 자주 쓴다. 
		 * 그 이유는 모든 타입의 데이터를 text(문자열)로 출력하는 Stream 이기 때문이다. 
		 * 주요 메서드 : println(), print() 
		 * 우리가 매일 쓰던 바로 그 녀석
		 * 어떤 값을 주던 문자열로 바꿔서 출력출력출력
		 * printf() 1.5에서 추가된 메서드
		 * node 스트림이면서 filter 스트림이다. 
		 * node 스트림 - 파일과 연결만 가능
		 * 네트워크와 연결해서 텍스르를 출력하고 싶다면 이걸 단독으로 쓸수 없고 파일과 연결할때는 그냥 직접 연결이 가능하다.
		 * 생성자를 보면 쉽게 알 수 있다.
		 * 캐릭터 계열과 바이트 계열 모두에서 붙여다가 쓸 수 있다. 왜냐면, 워낙에 많이 쓰는 녀석이기 때문이다.
		 * 
		 */
		PrintWriter pw = null;
		try {
			//1.연결
			//pw = new PrintWriter(new FileWriter(fileName, true));//이렇게 하는게 기본이지만, 프린트라이터는 노드이면서 필터이기 때문에 줄여서 쓸 수 있다.
			pw = new PrintWriter(fileName);
			//두번째 인수로 true를 주면 auto flush 기능이 추가된다. 프린트Ln할때마다 플러쉬~ 채팅에서 사용된다. 
			//근데 기억할 것은 오토 플러쉬를 할려면 반드시 파일 스트림이 필요하다. 왜냐면, 파일 스트림에서는 오토플러쉬 기능이 아에 필요가 없기 때문이다.
			//누가 파일에다가 문자열 적는데 하나 적고 플러쉬 하고 하나 적고 플러쉬 하냐. 그러니까 없는겨.
			//2. 출력
			pw.println("안녕하세요 반갑습니다용");
			pw.println('A');
			pw.println(true);
			pw.println(2492891);
			pw.flush();//버퍼에 쌓인 내뇽을 연결된 외부자원으로 출력해준다. 변기 물내리듯이.
			//이 flush를 사용하지 않으면 버퍼는 자기 안의 공간이 꽉 차지 않는 이상 외부자원으로 출력하지 않는다.
			//만약 flush를 하고 클로즈를 하지 않는 다면 플러시를 쓰지 않을 떄와는 달리 정상적으로 출력 된다.
			//그러니까 플러쉬, 클로즈 둘중에 하나만 쓰면 된다는 뜻!
			
			//printWriter는 기본적으로 노트스트림이 아니고 필터스트림인데 그냥 생성자에서 처리해주는 것이다. 
			
		}finally{
			if(pw != null){
				pw.close();
				//close()를 하지 않으면 출력이 되지 않는다.
				//왜냐면, 프린트라이트도 버퍼를 사용하기 때문이다. 
				//보통 버퍼가 꽉차면 그것을 연결된 스트림으로 넘긴다. 
				//클로즈는 버퍼에 내용이 꽉차지 않는다고 하더라도 일단 지금까지 버퍼에 있던 내용을
				//최종 저장소로 밀어 넣고 스트림을 끊는다.
				//클로즈가 그냥 단순히 스트림을 끊는게 아니고 이러한 역할을 한다. 버퍼에 담긴 내용을 밀어넣는 그런 역할
				//그러니까 클로즈는 변기에 똥을 싸면 버튼을 눌러주는 역할을 한다. flush()역할
			}
		}
	}
}
